/**
 * 加密,解密
 * 用这个会目前没有问题
 *
 * 如果是对象,加密时会自动转成json,解密后需要parse
 * 最好不要直接加密对象,先转成json
 *
 * key 越短,加密长度越短
 *
 *
 * 建议使用：
 *
 *  d(), e() 方法
 *
 *  数组,对象用
 *  dd(), ee() 方法
 *
 *  =================================
 *
 *  经测试:
 *
 *    使用新名字方法
 *    全部使用 encode(), parse() 方法来代替
 */

import { Base64 } from 'js-base64'

// to api define
const AA = '=Z'

export default {
  // 加密
  encrypt (word, key = 'C') {
    return Base64.encode(key + word)
  },
  // 解密
  decrypt (word, key = 'C') {
    const str = Base64.decode(word)
    return str.substring(key.length)
    // return Base64.decode(word)
  },
  // api 用这个解
  d(word, key = 'Y') {
    const str = word.substring(AA.length)
    const m2 = this.decrypt(str, key)
    // console.log(m2)
    const m1 = this.decrypt(m2)
    // console.log(m1)
    return m1
  },
  // 对应api加密
  e(word, key = 'Y') {
    const m1 = this.encrypt(word)
    const m2 = this.encrypt(m1, key)
    return AA + m2
  },
  /**
   * array|object decrypt
   *
   * @param word
   * @returns {any}
   */
  dd(word) {
    return JSON.parse(this.d(word))
  },
  /**
   * array|object encrypt
   *
   * @param word
   * @returns {*}
   */
  ee(word) {
    return this.e(JSON.stringify(word))
  },

  // ----------------------------------------------

  encode(data) {
    return this.ee(data)
  },
  parse(data) {
    return this.dd(data)
  },

  /*
    由于在处理小程序时, 传递url参数时, 前面带了一个=
    这样就有2个==, 小程序会获取不到参数,
    H5和APP不受影响,
    所以要去掉前面一个=
   */
  encodeUrl(data) {
    return this.ee(data).slice(1)
  },
  parseUrl(data) {
    return this.dd('=' + data)
  },
}
